package com.shujia

object Demo05Func01 {
  /**
   * 函数可以定义在哪？
   * 1、可以在类class中定义
   * 2、可以在类对象Object中定义，默认是静态的，可以通过类对象进行调用
   * 3、可以在函数内进行定义
   */

  /**
   * def 关键字，声明一个函数（方法）
   * func01 方法名，通常首字母小写
   * 小括号内的表示函数参数的声明，如果有多个参数可以使用”逗号,“进行分隔
   * 函数的参数分为两个部分：参数名、参数类型，两者通过“冒号:”进行分隔，参数名在前:参数类型在后
   * 参数名：str
   * 参数类型：String
   * 小括号右边的"冒号:" 表示定义函数的返回值类型 在这里表示函数的返回值类型为Int
   * {方法体}
   */
  def func01(str: String): Int = {
    val str2Int: Int = str.toInt
    return str2Int
  }


  /**
   * 函数的省略规则：
   * 1、return关键字可以省略，默认最后一行代码(除定义语句外)作为返回值
   * 2、如果代码只有一行，则花括号可以省略
   * 3、函数的返回值类型可以省略 (不推荐)
   * 4、如果函数没有参数，则括号可以省略
   */

  def func01_1(str: String): Int = {
    val str2Int: Int = str.toInt
    str2Int
  }

  def func01_2(str: String): Int = str.toInt

  def func01_3(str: String) = str.toInt

  // 这是一个函数 不是变量！！！
  def func01_4 = "1234".toInt

  /**
   * 匿名函数：没有名字的函数，可以作为另一个函数的参数进行传递(主要的使用)，也可以作为返回值传递
   * 匿名对象：没有名字的对象
   *
   */

  /**
   * 匿名函数的定义：
   * 参数=>方法体
   * (参数名1:参数的类型1,参数名2:参数的类型2,参数名3:参数的类型3)=>{方法体}
   */
  // 例如：将func01转换成匿名函数如下所示
  (str: String) => str.toInt

  // 匿名函数也可以拥有名字，那就可以使用名字进行调用
  // 注意：func01_anonymous1在这里是一个变量，只不过它的类型是匿名函数类型（即函数类型）
  val func01_anonymous1 = (str: String) => str.toInt
  // 声明类型 “String => Int” 就是func01_anonymous2变量的类型
  val func01_anonymous2: String => Int = (str: String) => str.toInt

  def main(args: Array[String]): Unit = {
    // 调用函数
    println(func01("100"))
    println(func01_1("200"))
    println(func01_2("300"))
    println(func01_3("400"))
    println(func01_4)
    println(func01_anonymous1("500"))

  }


}


